package com.jhy.review.mianshi;

import java.util.Stack;

/**
 * @author go_jhy
 * @create 2022/6/14 - 下午 5:12
 *给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串，判断字符串是否有效。
 *
 * 有效字符串需满足：
 *
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 * 注意空字符串可被认为是有效字符串。
 *
 * 示例 1:
 *
 * 输入: "()"
 * 输出: true
 * 示例 2:
 *
 * 输入: "()[]{}"
 * 输出: true
 * 示例 3:
 *
 * 输入: "(]"
 * 输出: false
 * 示例 4:
 *
 * 输入: "([)]"
 * 输出: false
 * 示例 5:
 *
 * 输入: "{[]}"
 * 输出: true
 *
 * 使用的栈的数据结构来解决这一问题 每次加到栈的时候 就用pop弹出来进行判断
 *
 */
@SuppressWarnings("all")
public class KuoHao2 {

    //首先我们定义一个方法
    public static  boolean isValid(String s){
        //判断整个字符串是否是偶数个 如果不是我们直接返回false
        if(s.length()%2 != 0){
            return false;
        }
        //先new一个栈的空间 存放的是character的字符
        Stack<Character> stack = new Stack();

        //循环整个数组，来对里面进行操作
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);

            if(c == '(' || c == '{' || c == '['){
                stack.push(s.charAt(i));
            }else {

                //判断栈 针对首先出现的右侧符号进行判断
                if(stack.isEmpty()){
                    return false;
                }


                //然后判断下一个加入进来的数
                char pop = stack.pop();

                if(c == ')' && pop != '('){
                    return false;
                }
                if(c == ']' && pop != '['){
                    return false;
                }
                if(c == '}' && pop != '{'){
                    return false;
                }

            }


        }
        //最后栈为空了 证明里面都没有数据了 所以为null
        return stack.isEmpty();


    }

    public static void main(String[] args) {
        boolean valid = isValid("([]){}");
        System.out.println(valid);
    }


}
